package com.example.flow

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.runBlocking

/**
map就是用于将一个值映射成另一个值
 */
fun main() {
    //map就是用于将一个值映射成另一个值
//    runBlocking {
//        val flow = flowOf(1, 2, 3, 4, 5)
//        flow.map {
//            it * it
//        }.collect {
//            println(it)
//        }
//    }
    //filter是用来过滤掉
//    runBlocking {
//        val flow = flowOf(1, 2, 3, 4, 5)
//        flow.filter {
//            it % 2 == 0
//        }.map {
//            it * it
//        }.collect {
//            println(it)
//        }
//    }
    //onEach
//    runBlocking {
//        val flow = flowOf(1, 2, 3, 4, 5)
//        flow.filter {
//            it % 2 == 0
//        }.onEach {
//            println(it)
//        }.map {
//            it * it
//        }.collect {
//        }
//    }
    //debounce:时间间隔
//    runBlocking {
//        flow {
//            emit(1)
//            emit(2)
//            delay(600)
//            emit(3)
//            delay(100)
//            emit(4)
//            delay(100)
//            emit(5)
//        }
//            .debounce(500)
//            .collect {
//                println(it)
//            }
//    }
    //sample：每隔一段时间采样
    runBlocking {
        flow {
            while (true) {
                emit("发送一条弹幕")
            }
        }
            .sample(1000)
            .flowOn(Dispatchers.IO)
            .collect {
                println(it)
            }
    }

}